package com.example.springdataes.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * 自定义类型，商品。
 * 让自定义类型和ElasticSearch中的一个索引产生关联
 * Document: spring data elasticSearch 提供的注解，描述类型，说明类型和索引的关系
 * indexName: 对应索引的名称，必要属性.
 * shards: 创建索引时，设置的主分片数量，默认5.
 * replicas: 创建索引时，设置的副本分片数量，默认1，
 * type: 对应的类型的名称.deprecated
 *
 */
@Data //注解在类上；提供类所有属性的 getting 和 setting 方法，此外还提供了equals、canEqual、hashCode、toString 方法
@Document(indexName="springdataes_product", shards=2, replicas=0)
public class Product {
    /**
     * Id注解是Spring Data核心工程提供的，是所有Spring Data二级子工程通用的，代表主键字段
     */
    @Id
    private String id;
    /**
     * Field注解，描述试实体类型中属性和ES索引中字段的关系，且可以为这个字段配置自定义映射mapping
     * 这个自定义映射mapping必须通过代码逻辑 调用设置映射的api 才能生效。
     * name: 索引中对应的字段名称，默认和属性同名
     * type: 索引中字段的类型，默认是FieldType.Auto，代表ES自动映射类型
     * analyzer: 字段的分词器名称，默认是standard。
     * fielddata: 是否开启正向索引，默认关闭。
     * 默认情况下，只会为文本类型的字段创建反向索引，提供快速搜索的逻辑。fielddata设置为true，则会额外创建一个正向索引，支持排序。
     * index: 是否创建默认的反向索引或正向索引。text文本类型字段默认创建反向索引，其他创建正向索引。
     * index=false表示不创建索引，没有索引，就不能作为搜索条件。
     */
    @Field(name = "title", type = FieldType.Text, analyzer = "ik_max_word", fielddata = true)
    private String title; // 商品名称，需要中文分词，且偶尔需要排序，常用搜索条件之一
    @Field(name = "sell_point", type = FieldType.Text, analyzer = "ik_max_word")
    private String sellPoint; // 卖点，需要中文分词，常用搜索条件之一
    @Field(type = FieldType.Long, index = false)
    private Long price; // 单价
    @Field(type = FieldType.Integer, index = false)
    private int num; // 库存
}
